package TDA_Lista;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**Define el comportamiento de un iterador de la lista. 
 * Implementacion generica. */
public class ElementIterator<E> implements Iterator<E> {
	protected PositionList<E> lista;
	protected Position<E> cursor;
	
	/**Constructor: crea un nuevo iterador para recorrer la lista que se pasa como parametro.
	 * @param l: lista sobre la cual se creara el iterador. */
	public ElementIterator(PositionList<E> l){
		lista = l;
		if(lista.isEmpty()) cursor = null;
		else
			try {
				cursor = lista.first();
			} 
			catch (EmptyListException e) {}
	}
	
	/**Testea si quedan elementos por visitar en la secuencia.
	 * @return true si quedan elementos por visitar, false en caso contrario. */
	public boolean hasNext(){
		return (cursor != null);
	}
	
	/**Retorna el proximo elemento a visitar en la secuencia. 
	 * @return el proximo elemento a visitar. */
	public E next()throws NoSuchElementException{
		if(cursor == null) throw new NoSuchElementException("Cursor nulo, no hay elemento para retornar.");
		E toReturn = cursor.element();
		try{
			try {
				if(cursor == lista.last()) cursor = null;
				else cursor = lista.next(cursor);
			} 
			catch (EmptyListException e) {}
		}
		catch(InvalidPositionException e){}
		catch(BoundaryViolationException e){}
		return toReturn;
	}
	
	public void remove(){}
}
